package utils.Logger;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.*;

/**
 * Created by whyang on 2017/06/05.
 */

public class LoggerUtils {

    /**
     * 创建Logger实例
     *
     * @paramclazz事件日志发生类
     * @paramifConsole是否输出到控制台
     * @paramifFile是否输出到文件
     * @paramlogFile日志文件地址（路径分割使用“/”）
     * @paramifLocate是否定位事件日志发生位置（类.方法 line）
     * @returnLogger
     */
    public static Logger getLogger(Class<?> clazz, boolean ifConsole, boolean ifFile, String logFile, boolean ifLocate) {

        if(ifConsole == false && ifFile == false) return null;

        if(ifFile == true && logFile.trim().length() < 1) return null;

        String conversionPattern;
        if(ifLocate == true) {
// 日志内容形式如：2014-03-11 01:34:45.572 [DEBUG] com.aliyun.qa.utils.LoggerUtilsTest.main(Line:15): 测试DEBUG日志
            conversionPattern ="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] %c.%M(Line:%L): %m %n";
        } else {
// 日志内容形式如：2014-03-11 01:34:45.572 [DEBUG] : 测试DEBUG日志
            conversionPattern ="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] : %m %n";
        }
        PatternLayout layout = new PatternLayout();
        layout.setConversionPattern(conversionPattern);

        Logger logger = Logger.getLogger(clazz);
        logger.removeAllAppenders();
        logger.setLevel(Level.DEBUG);
        logger.setAdditivity(false);// Logger不会在父Logger的appender里输出，默认为true

        if(ifConsole == true) {// 日志输出到控制台
            ConsoleAppender consoleAppender = new ConsoleAppender();
            consoleAppender.setLayout(layout);
            consoleAppender.setThreshold(Level.INFO);// ConsoleAppender日志级别为DEBUG
            consoleAppender.activateOptions();
            logger.addAppender(consoleAppender);
        }

        if(ifFile == true) {// 日志输出到文件
            FileAppender fileAppender = new FileAppender();
            fileAppender.setLayout(layout);
            fileAppender.setFile(logFile);
            fileAppender.setEncoding("UTF-8");
            fileAppender.setAppend(true);
            fileAppender.setThreshold(Level.INFO);// FileAppender日志级别为INFO
            fileAppender.activateOptions();
            logger.addAppender(fileAppender);
        }

        return logger;
    }

    /**
     * 创建Logger实例（仅输出到控制台）
     *
     * @paramclazz事件日志发生类
     * @paramifLocate是否定位事件日志发生位置（类.方法 line）
     * @returnLogger
     */
    public static Logger getLogger(Class<?> clazz, boolean ifLocate) {
        return getLogger(clazz, true, false, null, ifLocate);
    }

    /**
     * 创建Logger实例（仅输出到文件）
     *
     * @paramclazz事件日志发生类
     * @paramlogFile日志文件地址（路径分割使用“/”）
     * @paramifLocate是否定位事件日志发生位置（类.方法 line）
     * @returnLogger
     */
    public static Logger getLogger(Class<?> clazz, String logFile, boolean ifLocate) {
        return getLogger(clazz, false, true, logFile, ifLocate);
    }

    /**
     * 是否开启Debug
     */
    public static boolean isDebug =  Logger.getLogger(LoggerUtils.class).isDebugEnabled();

    /**
     * Debug 输出
     * @param clazz  	目标.Class
     * @param message	输出信息
     */
    public static void debug(Class<? extends Object> clazz ,String message){
        if(!isDebug)return ;
        Logger logger = Logger.getLogger(clazz);
        logger.debug(message);
    }
    /**
     * Debug 输出
     * @param clazz  	目标.Class
     * @param fmtString 输出信息key
     * @param value		输出信息value
     */
    public static void fmtDebug(Class<? extends Object> clazz,String fmtString,Object...value){
        if(!isDebug)return ;
        if(StringUtils.isBlank(fmtString)){
            return ;
        }
        if(null != value && value.length != 0){
            fmtString = String.format(fmtString, value);
        }
        debug(clazz, fmtString);
    }
    /**
     * Error 输出
     * @param clazz  	目标.Class
     * @param message	输出信息
     * @param e			异常类
     */
    public static void error(Class<? extends Object> clazz ,String message,Exception e){
        Logger logger = Logger.getLogger(clazz);
        if(null == e){
            logger.error(message);
            return ;
        }
        logger.error(message, e);
    }
    /**
     * Error 输出
     * @param clazz  	目标.Class
     * @param message	输出信息
     */
    public static void error(Class<? extends Object> clazz ,String message){
        error(clazz, message, null);
    }
    /**
     * 异常填充值输出
     * @param clazz 	目标.Class
     * @param fmtString	输出信息key
     * @param e			异常类
     * @param value		输出信息value
     */
    public static void fmtError(Class<? extends Object> clazz,Exception e,String fmtString,Object...value){
        if(StringUtils.isBlank(fmtString)){
            return ;
        }
        if(null != value && value.length != 0){
            fmtString = String.format(fmtString, value);
        }
        error(clazz, fmtString, e);
    }
    /**
     * 异常填充值输出
     * @param clazz		目标.Class
     * @param fmtString 输出信息key
     * @param value		输出信息value
     */
    public static void fmtError(Class<? extends Object> clazz,
                                String fmtString, Object...value) {
        if(StringUtils.isBlank(fmtString)){
            return ;
        }
        if(null != value && value.length != 0){
            fmtString = String.format(fmtString, value);
        }
        error(clazz, fmtString);
    }

}

